package com.redis.authorization.service;

import com.redis.common.service.CustomUserDetailsService;
import com.redis.common.service.SecurityUser;
import org.springframework.security.core.authority.AuthorityUtils;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

/**
 * @description: UserDetailsService 自定义实现类
 * @Author C_Y_J
 * @create 2022/1/7 14:02
 **/
@Service
public class UserDetailsServiceImpl implements CustomUserDetailsService {

    private final PasswordEncoder passwordEncoder;

    public UserDetailsServiceImpl(PasswordEncoder passwordEncoder) {
        this.passwordEncoder = passwordEncoder;
    }

    /**
     * @see org.springframework.security.core.userdetails.UserDetailsService#loadUserByUsername(java.lang.String)
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        return buildUser(username);
    }

    private UserDetails buildUser(String username) {

        // 根据用户名查找用户信息

        // 对用户信息进行判断符合项目的需求

        // 将用户信息封装到User对象中，这里的User对象是spring security 中的。spring security将会进行密码校验，状态判断

        // 我这里是简化，真实项目中不允许。
        String password = passwordEncoder.encode("123456");
        return new SecurityUser(1001, 2001, "16670804533", "头像", username, password,
                true, true, true, true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER"));
    }

    /**
     * 根据mobile登录
     *
     * @param mobile
     * @return
     * @throws UsernameNotFoundException
     */
    @Override
    public UserDetails loadUserBySocial(String mobile) throws UsernameNotFoundException {
        // feign远程调用：根据用户名查找用户信息

        // 根据查找到的用户信息判断用户是否被冻结，是否禁用，可以做一些逻辑判断

        // 密码 123456 应该通过 passwordEncoder.encode("123456") 加密后得到的字符串 存入数据库后直接拿出来用 。我这里是演示效果
        String password = passwordEncoder.encode("123456");

        // 确认无误后， 将用户信息返回给 spring security 框架，它会对用户名和密码 和数据库查询的用户信息做对比
        return new SecurityUser(null, null, mobile, null, "admin", password,
                true, true, true, true,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,ROLE_USER"));
    }
}
